-- $LastChangedDate: 2007-06-01 02:52:33 +0200 (Fri, 01 Jun 2007) $
-- $LastChangedRevision: 149 $
-- $LastChangedBy: vicente $

-- packages del gimnasio
WITH Tiposprotegidos.Log;
USE Tiposprotegidos.Log;

SEPARATE (Tareas.Gmedicos)

   -- Buscar el medico con identificador Id en la lista MList y marcarlo
   -- como libre
PROCEDURE Mark_Medico_As_Idle (
      Mlist        : IN     Listas.Gmedicos_Lists.List_Type;
      Medid        : IN     Task_Id;
      Free_Medicos : IN OUT Natural) IS
   Encontrado : Boolean                             := False;
   It         : Listas.Gmedicos_Lists.List_Iterator;
   Nodo       : Nodomedico;
BEGIN

   It := Listas.Gmedicos_Lists.First(Mlist);
   WHILE It /= Listas.Gmedicos_Lists.Last(Mlist) AND NOT
         Encontrado LOOP
      Nodo := Listas.Gmedicos_Lists.Value(It);
      IF Nodo.Id = Medid THEN
         Encontrado:= True;
      ELSE
         It := Listas.Gmedicos_Lists.Succ(It);
      END IF;
   END LOOP;

   -- si no encuentra el medico deberia mostrar algun tipo de error
   IF NOT Encontrado THEN
      Print("mark_medico_as_idle: el medico " & Image(Medid) & " no existe");
   ELSE
      IF Nodo.Estado /= Libre THEN
         Free_Medicos := Free_Medicos + 1;
         -- log
         Log_Add(Medico_Libre);
         Nodo.Estado := Libre;
         Listas.Gmedicos_Lists.Update(It, Nodo);
      END IF;
      Print("mark_medico_as_idle: medico "&
         Image(Nodo.Id)&" marcado como libre");
   END IF;
END Mark_Medico_As_Idle;
